#include "ThreadPool.hpp"
#include <iostream>
#include <string>
#include <memory>
#include "Log.hpp"
#include <ctime>
#include <sys/types.h>
#include <unistd.h>
#include "Task.hpp"

// int main()
// {
//     LOG(DEBUG, "开始创建\n");
//     sleep(2);
//     ThreadPool<Task>::GetINstance();
//     //sleep(2);

//     ThreadPool<Task>::GetINstance();
//     //sleep(2);
//     ThreadPool<Task>::GetINstance();
//     //sleep(2);
//     ThreadPool<Task>::GetINstance();
//     //sleep(2);
//     ThreadPool<Task>::GetINstance()->WaitAll();
//    // sleep(2);
//     return 0;
// }

int main()
{
    //选择日志显示功能
    EnableScream();
    // EnableFile();

    srand(time(nullptr)^getpid()^pthread_self());
    // // LogMessage(__FILE__, __LINE__, DEBUG, "Log massage %d %s", 10, "hello");
    // LOG(DEBUG, "Log massage %d %s", 10, "hello");
    // LOG(DEBUG, "Log massage ");

    //make_unique C++14语法构建一个只能指针
    //std::unique_ptr<ThreadPool<Task>> tp = std::make_unique<ThreadPool<Task>>();
    //ThreadPool<Task>::GetINstance()->InitThreadPool();
    //ThreadPool<Task>::GetINstance()->Start();

    for (int i = 0; i < 10; i++)
    {
        int a = rand() % 10 + 1;
        usleep(1234);
        int b = rand() % 10 + 1;
        Task t(a, b);
        LOG(INFO, "main thread push a task: %s", t.DebugtTostring().c_str());
        ThreadPool<Task>::GetINstance()->Enqueue(t);
        sleep(1);
    }

    sleep (5);
    ThreadPool<Task>::GetINstance()->Stop();
    ThreadPool<Task>::GetINstance()->WaitAll();
    // tp->Push();
    return 0;
}

// int main()
// {
//     //选择日志显示功能
//     EnableScream();
//     // EnableFile();

//     srand(time(nullptr)^getpid()^pthread_self());
//     // // LogMessage(__FILE__, __LINE__, DEBUG, "Log massage %d %s", 10, "hello");
//     // LOG(DEBUG, "Log massage %d %s", 10, "hello");
//     // LOG(DEBUG, "Log massage ");

//     //make_unique C++14语法构建一个只能指针
//     std::unique_ptr<ThreadPool<Task>> tp = std::make_unique<ThreadPool<Task>>();
//     tp->InitThreadPool();
//     tp->Start();

//     for (int i = 0; i < 10; i++)
//     {
//         int a = rand() % 10 + 1;
//         usleep(1234);
//         int b = rand() % 10 + 1;
//         Task t(a, b);
//         LOG(INFO, "main thread push a task: %s", t.DebugtTostring().c_str());
//         tp->Enqueue(t);
//         sleep(1);
//     }

//     sleep (5);
//     tp->Stop();
//     tp->WaitAll();
//     // tp->Push();
//     return 0;
// }